package medOffice;

/** Classe de testes de Plano De Saude.
* @author tiago leite
*/
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class PlanoDeSaudeTestes {
	
	private PlanoDeSaude p1, p2, p1Copia;
	
	@Before
	public void setUp() throws Exception {
		p1 = new PlanoDeSaude("Unimed", "(83) 3333-1122", 50.0, 0.0, 152233);
		p1Copia = new PlanoDeSaude("Unimed", "(83) 3333-1122", 50.0, 0.0, 152233);
	}	
	
	@Test
	public void testConstrutor() {
		Assert.assertNotNull("Objeto nao deveria ser nulo.", p1);
		Assert.assertEquals("Construtor com problema.", "Unimed", p1.getNomeDoPlano());
		Assert.assertEquals("Construtor com problema.", "(83) 3333-1122", p1.getTelefoneContato());		
		Assert.assertEquals("Construtor com problema.", 50.0, p1.getValorConsulta(), 0.0001);
		Assert.assertEquals("Construtor com problema.", 0.0, p1.getValorRetorno(), 0.0001);
		Assert.assertEquals("Salario nao calculado corretamente.", 152233, p1.getCodigo());
	}
	
	@Test(expected=Exception.class)
	public void testConstrutorExceptionNomeNull() throws Exception {
		p2 = new PlanoDeSaude(null, "(83) 3333-1122", 50.00, 0.00, 152233);
	}
	
	@Test(expected=Exception.class)
	public void testConstrutorExceptionNomeVazio() throws Exception {
		p2 = new PlanoDeSaude("", "(83) 3333-1122", 50.00, 0.00, 152233);
	}
	
	@Test(expected=Exception.class)
	public void testConstrutorExceptionTelefoneNull() throws Exception {
		p2 = new PlanoDeSaude("Unimed", null , 50.00, 0.00, 152233);
	}
		
	@Test(expected=Exception.class)
	public void testConstrutorExceptionNomeTelNull() throws Exception {
		p2 = new PlanoDeSaude(null, null , 50.00, 0.00, 152233);
	}
	
	@Test(expected=Exception.class)
	public void testConstrutorExceptionValorConsultaNegativo() throws Exception {
		p2 = new PlanoDeSaude("Unimed", "(83) 3333-1122" , -50.00 , 0.00, 152233);
	}
	
	@Test(expected=Exception.class)
	public void testConstrutorExceptionValorRetornoNegativo() throws Exception {
		p2 = new PlanoDeSaude("Unimed", "(83) 3333-1122" , 50.00 , -45.00, 152233);
	}
	
	@Test(expected=Exception.class)
	public void testConstrutorExceptionValorConsultaRetornoNegativo() throws Exception {
		p2 = new PlanoDeSaude("Unimed", "(83) 3333-1122" , -50.00 , -45.00, 152233);
	}
	
	@Test(expected=Exception.class)
	public void testConstrutorExceptionValorCodigoNegativo() throws Exception {
		p2 = new PlanoDeSaude("Unimed", "(83) 3333-1122" , 50.00 , 45.00, -288585);
	}
	
	@Test
	public void testSetNomeDoPlano() throws Exception {
		try {
			p1.setNomeDoPlano("");
		} catch ( Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Nome invalido", e.getMessage());
		}
		Assert.assertEquals("Nome errado 1.", "Unimed", p1.getNomeDoPlano());
		try {
			p1.setNomeDoPlano(null);
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Nome invalido", e.getMessage());
		}
		Assert.assertEquals("Nome errado 2.", "Unimed", p1.getNomeDoPlano());
		p1.setNomeDoPlano("Plus Saude");
		Assert.assertEquals("Nome errado 3.", "Plus Saude", p1.getNomeDoPlano());
		try {
			p1.setNomeDoPlano("UNI456MED");
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Nome invalido", e.getMessage());
		}
		Assert.assertEquals("Nome errado 4.", "Plus Saude", p1.getNomeDoPlano());
	}
	
	@Test
	public void testSetTelefoneContato() throws Exception { 
		Assert.assertEquals("Telefone errado 1.", "(83) 3333-1122", p1.getTelefoneContato());
		try {
			p1.setTelefoneContato(null);
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Formatacao invalida para telefone", e.getMessage());
		}
		Assert.assertEquals("Telefone errado 2.", "(83) 3333-1122", p1.getTelefoneContato());
		p1.setTelefoneContato("(83) 3311-6969");
		Assert.assertEquals("Telefone errado 3.", "(83) 3311-6969", p1.getTelefoneContato());
		try {
			p1.setTelefoneContato("3315");
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Formatacao invalida para telefone", e.getMessage());
		}
		Assert.assertEquals("Telefone errado 4.", "(83) 3311-6969", p1.getTelefoneContato());
		try {
			p1.setTelefoneContato("33229090");
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Formatacao invalida para telefone", e.getMessage());
		}
		Assert.assertEquals("Telefone errado 5.", "(83) 3311-6969", p1.getTelefoneContato());
		try {
			p1.setTelefoneContato("(83) 3311-696a");
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Formatacao invalida para telefone", e.getMessage());
		}
		Assert.assertEquals("Telefone errado 6.", "(83) 3311-6969", p1.getTelefoneContato());
	}
	
	@Test
	public void testSetValorConsulta() throws Exception {
		try {
			p1.setValorConsulta(-90.00);
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Valor deve ser positivo", e.getMessage());
		}
		Assert.assertEquals("Valor da consulta 2 errado.", 50.00, p1.getValorConsulta(), 0.0001);
		p1.setValorConsulta(100.00);
		Assert.assertEquals("Valor da consulta 3 errado", 100.00, p1.getValorConsulta(), 0.0001);
		p1.setValorConsulta(159);
		Assert.assertEquals("Valor da consulta 4 errado", 159.00, p1.getValorConsulta(), 0.0001);
		try {
			p1.setValorConsulta(-200.00);
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Valor deve ser positivo", e.getMessage());
		}
		Assert.assertEquals("Valor da consulta 5 errado", 159.00, p1.getValorConsulta(), 0.0001);
		p1.setValorConsulta(159.515165165161815846845955956353);
		Assert.assertEquals("Valor da consulta 6 errado", 159.515165165161815846845955956353, p1.getValorConsulta(), 0.0001);
		
	}
	
	@Test
	public void testSetValorRetorno() throws Exception {
		try {
			p1.setValorRetorno(-50.00);
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Valor deve ser positivo", e.getMessage());
		}
		Assert.assertEquals("Valor de retorno 1 errado.", 0.00, p1.getValorRetorno(), 0.0001);
		p1.setValorRetorno(100.00);
		Assert.assertEquals("Valor de retorno 2 errado.", 100.00, p1.getValorRetorno(), 0.0001);
		p1.setValorRetorno(0.00);
		Assert.assertEquals("Valor de retorno 3 errado", 0.00, p1.getValorRetorno(), 0.0001);
		p1.setValorRetorno(20);
		Assert.assertEquals("Valor de retorno 4 errado", 20.00, p1.getValorRetorno(), 0.0001);
		try {
			p1.setValorRetorno(-90.00);
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Valor deve ser positivo", e.getMessage());
		}
		Assert.assertEquals("Valor de retorno 5 errado", 20.00, p1.getValorRetorno(), 0.0001);
		p1.setValorRetorno(2000);
		Assert.assertEquals("Valor de retorno 6 errado", 2000.00, p1.getValorRetorno(), 0.0001);
		p1.setValorRetorno(2000.584868462154);
		Assert.assertEquals("Valor de retorno 7 errado", 2000.584868462154, p1.getValorRetorno(), 0.0001);
	} 
	
	@Test
	public void testSetCodigo() throws Exception {
		try {
			p1.setCodigo(-5084538);
		} catch (Exception e) {
			Assert.assertEquals("Mensagem de exceção inesperada", "Codigo invalido", e.getMessage());
		}
		Assert.assertEquals("Codigo 1 errado.", 152233, p1.getCodigo());
		Assert.assertEquals("Codigo 2 errado.", 152233, p1.getCodigo());
		p1.setCodigo(4853254);
		Assert.assertEquals("Codigo 3 errado", 4853254, p1.getCodigo());
	}
	
	@Test
	public void testPlanosIguais() {
		Assert.assertEquals("Planos diferentes 1.", false , p1.equals(p2));
		Assert.assertEquals("Planos diferentes 1.", true , p1.equals(p1Copia));
		Assert.assertEquals("Planos diferentes 1.", false , p1Copia.equals(p2));
		
	}
}

